//
// Created by QU on 24-6-24.
//
#include <iostream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <new>
#include <thread>
#include <algorithm>
#include <array>
#include <string>
#include <deque>

using std::cout, std::cin, std::endl;

consteval int sqr(int n) { return n * n; }

int main(int argc, const char* argv[])
{
    // 前面我们曾提到过，constexpr声明函数时并不依赖常量表达式上下文环境，在非常量表达式的环境中，函数可以表现为普通函数。
    // 不过有时候，**我们希望确保函数在编译期就执行计算，对于无法在编译期执行计算的情况则让编译器直接报错**。于是在C++20标准中出现了
    // 一个新的概念——立即函数，该函数需要使用consteval说明符来声明：

    constexpr int r = sqr(100); // 编译成功
    constexpr int x = 100;
    int r2 = sqr(x); // 编译失败
    // 在上面的代码中sqr(100);是一个常量表达式上下文环境，可以编译成功。相反，因为sqr(x);中的x是可变量，不能作为常量表达
    // 式，所以编译器抛出错误。要让代码成功编译，只需要给x加上const即可。



    return 0;
}
